--[[

	通用常量

--]]

local M = class("Constant")

function M:ctor()

    self:register()
end

--热更会自动调用
function M:register()
    --节点类型, 对应server_config中配置
    self.node_type = {
        game = "ndgame",
        web = "ndweb",
        logs = "ndlogs",
        bot = "ndbot",
        test = "ndtest",
    }

    --游戏类型
    self.game_type = {
        texas = 0,
        snooker = 1,
    }

    --登录类型
    self.gw_account = "gw_account"
    self.gw_token = "gw_token"
    self.login_xxtea_key = "7flower"

    self.cluster_node_dead_time = 100 --集群结点失效的时间隔(秒)
    self.cluster_node_update_iterval = 15 --结点更新存活的间隔(秒)
    self.cluster_check_interval = 10 --更新cluster有效结点间隔(秒)

    self.collect_time = 360*100 --服务gc回收的时间 1/100s

    --redis key
    self.redis_key = {
        user_token = "user_token",
        user_pos = "user_pos", --aid: 节点名
        match_pos = "match_pos",
        table_money = "table_money", --桌子带入
        node_tables = "node_tables", --节点所建桌子
        ban_user = "ban_user", --封号
        room_user_num = "room_user_num", --房间用户人数
        member_profile_info = "member_profile_info", --个人信息
        member_game_info = "member_game_info", --货币信息
        texas_match = "mtt", --比赛信息
        texas_match_sign_up = "sign:mtt", --比赛报名表
        member_card_info = "member_card_info", --最好牌记录
        texas_jackpot = "texas_jackpot",
        mtt_all = "mtt:all",
        m_info_key_mid = "m_info_key_mid",
    }
    --redis key 过期时间
    self.redis_ex = {
        common = 5*60, --秒
        node_lock = 3*1000, --默认的节点竞争锁的超时时间(3秒)
        match = 60*60*3, --3h
        ban_user = 30, --秒
        seven_day = 3600 * 24 * 7,
        one_hour = 3600, --1个小时
        tow_hour = 3600*2,
        three_hour = 3600*3,
        four_hour = 3600*4,
        one_day = 3600*24,
    }
    self.redis_time = {
        default_exprie = 3600*24*2, -- 过期时间
        re_expire_ttl = 3600*12*1, -- ttl 小于此值时重新设置过期时间(必须小于default)
        account_info_expire = 3600 * 24 * 2,
        qutoutiao_ad_expire = 3600 * 24 * 7,    --趣头条用户数据缓存时间
        qq_ad_token_expire = 3600 * 24 * 30,    --广点通token数据缓存时间
        treature_records_expire = 3600 * 24 * 14, -- 寻宝记录的数据缓存时间
    }

    self.mysql_worker_num  = 2 --服务数
    self.redis_worker_num  = 2 --服务数
    self.rabbit_worker_num  = 1 --服务数

    --定时器相关
    self.timer = {
        common = 60,
        very_sec = 1, --每秒
    }

    --踢人原因
    self.kick_reason = {
        load_data_failed   = 1, -- 加载数据失败
        login_other_place  = 2, -- 在其它地方登陆
        inactive           = 3, -- 太久不活跃
        server_being_close = 4, -- 服务器即将关闭
        banned_account     = 5, -- 被封号了
        unknown_error      = 6, -- 未知异常
        gm_maintain        = 7,  -- GM维护
        request_too_fast   = 8, -- 请求数量过多
        kick_silent        = 9, -- 静默踢人
        not_health_time    = 10, -- 不在健康游戏时间
        servers_optimize   = 11, -- 服务器优化中,暂时不能进入游戏,非常抱歉!
        reg_nums_limit     = 12, -- 注册数量限制
        cheat_kick         = 13, -- 防作弊踢人
        cancel_account     = 14, -- 注销账号
    }

    -- 比赛配置
    self.match = {
        -- 缓存中比赛过期时间
        pos_expires = 30,
        pos_refresh_interval = 10,
        check_active_interval = 30, --检测比赛是否被加载
        rank_expire_t = 30 * 24 * 3600,     -- 比赛排行榜最大存在时间
        req_rank_refresh_t = 1,
        notify_upd_cfg_interval = 1 * 60,   --每分鐘刷新一次配置
        wait_init_time        = 10, --初始化完成
        send_count            = 3, --单次推送比赛列表得个数
        match_record_cnt      = 50, --比赛记录的条数
        match_record_day      = 7 * 24 * 3600, --比赛记录的天数
        match_disenalbe_apply = 60, --比赛结束前1分钟禁止报名
        send_good_news        = 1, -- 是否推送比赛喜报
        match_upd_interval    = 30, --比赛刷新间隔
        record_expires_tm     = 24 * 60 * 60, --比赛记录缓存时间最长24 消失
        match_type = {
            time_match = 1, --定时赛
            fill_match = 2 ,--人满赛
        },
        time_start_ready = 90, --提前多少通知比赛开始
        time_week_start_ready = 5*60, --提前多少通知比赛开始
    }

    --金币修改原因
    self.chip = {
        s_f_descr = 0, --减少
        s_f_add = 1, --增加
        s_m_buyin = 1000,                  -- 坐下买入
        s_m_buyin_return = 1001,                  -- 坐下失败退还
        s_m_rebuyin = 1002,                  -- 续买
        s_m_game_over = 1003,                  -- 牌局结算
        s_m_stand_up = 1004,                  -- 站起
        s_m_giveup_return = 1005,  -- 牌局退回
        s_m_mtt = 1006,  -- mtt比赛奖励
        s_node_restart = 1007,  -- 节点重启时退还
        s_m_jackpot = 1008,  --获得jackpot

        s_m_sng_signup = 2000,                  -- sng 购买门票
        s_m_sng_reward = 2001,                  -- sng 奖励
        s_m_sng_return = 2002,                  -- sng 退票
        s_m_pay_item = 3000,                  -- 购买道具
        s_m_server_reload = 9000,                  -- 服务器检查
        s_m_bot_rechange = 10000,                 -- 机器人更改筹码
    }

    self.room = {
        clear_desk_time = 2000, --1/100秒， 清除无人桌子的时间
        max_desk_num = 0, --最大的无人桌子数
        state_init = 0, --未开始状态
        state_start = 1, --开始状态
        state_end = 2, --已结束
        state_cancel = 3, --已取消
        enroll_status_start = 0, --报名状态
        enroll_status_delay = 1, --延时报名
        enroll_status_close = 2, --报名结束
        no_oper_num = 1, --不操作2次托管
        no_oper_round = 5, --5局不操作站起
    }
    --房间类型
    self.room_type = {
        normal = 0, --普通场
        match = 1, --比赛场
    }

    self.user = {
        max_heart_time = 5*60, --10分钟没收到心跳就踢出
        register_pos = 120 --120秒注册一次redis
    }

    self.event = {
        match_start = {type=1, data="比赛开始"}
    }

    --机器人
    self.robot = {
        max_total_num = 30, --总机器人数
        max_room_robot_num = 10, --房间最多机器人数
        max_desk_robot_num = 4, --桌子最多机器人数
        min_desk_robot_num = 2, --桌子最少机器人数
        room_table_num = 0, --房间预开桌子数
        --开启机器人的房间
        normal_room = {
            2,3,
            --2,3,4,
            --2,3,4,5,6,
        },
        max_mid = 10000, --机器人最大id号
        match_max_robot_num = 9, --比赛场机器人数
    }
    --各种开关
    self.switch = {
        test_cmd = true, --测试开关
        test_match_cmd = false, --测试开关比赛场
        bot_normal = true, --机器人开关
        bot_match = true, --机器人比赛场开关
        filter_chinese = true, --关闭中文
        word_filter = true, --过滤敏感字
    }

    self.cmdstat_enable = false --接口耗时打印(用于排查问题

    --self.max_online_user = 800 -- 最大在线玩家数
    self.max_conn_per_sec = 100 -- 每秒最大连接数
    --self.max_login_per_sec = 30 -- 每秒最大登陆玩家数

    --消息数量检测
    self.check_msg = {
        enable = false, --开关
        interval = 5, --检测时间间隔
        C2_TS_message = 20, --协议对应的最大次数
        default_count = 15, --间隔内可接收到的消息数
        kick_cnt = 2, --非法次数，到达就踢下线(比如5秒内收到10个消息，连续2次出现
        out_kick_time = 10*60 --10分钟重置下非法次数
    }
    --封号检测(
    self.ban_limit = {
        enable = true, --开关

    }

    --创建有积分的比赛uid
    self.match_uid = 5193

    --日志级别
    --self.log_level = "waring" --debug, info, waring, error, fatal
    --if g and g.log then
    --    g.log:setLevel(self.log_level)
    --end

    --旁观时间
    self.max_look_time = 10*60
end

--取redis_key
function M:getRedisKey(name, key1, key2)
    if not self.redis_key[name] then
        return nil
    end
    local key = self.redis_key[name]
    if key1 then
        key = self.redis_key[name]..":"..key1
    end
    if key2 then
        key = self.redis_key[name]..":"..key2
    end
    return key
end



--表名生成redis key
function M:getRedisKeyByTablename(tablename, id)
    if not (tablename and id) then
        error(string.format("getRedisKeyByTablename failed"))
    end
    local key_str =  string.format("%s:%s", tablename, id)
    return key_str
end






return M